热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

宿主|放入_定制.NET6.0的依赖注入

篇首语:本文由编程笔记#小编为大家整理,主要介绍了定制.NET6.0的依赖注入相关的知识,希望对你有一定的参考价值。本章是《定制ASPNET6.0框架系列文章》的第

篇首语:本文由编程笔记#小编为大家整理,主要介绍了定制.NET 6.0的依赖注入相关的知识,希望对你有一定的参考价值。


本章是《定制ASP NET 6.0框架系列文章》的第三篇。在本章,我们将学习ASP.NET Core的依赖项注入(DI)以及如何自定义它。
我们将讨论以下主题:


  • 使用不同的DI容器

  • 探索ConfigureServices方法

  • 使用其他的ServiceProvider

  • Scrutor简介


技术准备


我们使用以下命令(你可以在console, shell,Bash终端),创建一个MVC应用:


dotnet new mvc -n DiSample -o DiSample

在Visual Studio中打开项目,或在控制台中键入以下命令,在Visual Studio Code中打开项目:


cd DiSample
code .

使用不同的DI容器


在大多数项目中,我们其实不需要使用不同的DI容器。ASP.NET Core中的现有DI基本上满足我们的需要。但是,你可能喜欢其他DI容器的其他功能:


  • 使用Ninject创建一个支持模块作为轻量级依赖项的应用程序。比如,您可能希望将模块放入特定目录中,并在应用程序中自动注册这些模块。

  • 在应用程序外部的配置文件中,比如,在XML或JSON文件中,而不是仅在C#中配置服务。这是各种DI容器中的常见功能,但ASP.NET Core中尚不支持。

  • 在运行时添加服务,获取动态的DI容器,这也是一些DI容器中的常见特性。


现在,让我们看看ConfigureServices方法是如何操作的。


探索ConfigureServices方法


我们将当前的ConfigureServices方法与以前的长期支持版本(TLS)进行比较,看看有什么变化。如果您使用版本3.1创建的ASP.NET Core项目,并打开Startup.cs文件,配置服务的方法如下所示:


public void ConfigureServices(IServiceCollection services)
    services.Configure(options =>
    
         options.CheckConsentNeeded = context => true;
    );
    services.AddControllersWithViews();
    services.AddRazorPages();

相反,在 ASP.NET Core 6.0,没有启动Startup.cs,服务的配置在Startup.cs中进行,如下所示:


var builder = WebApplication.CreateBuilder(args);
// Add services to the container. builder.Services.AddControllersWithViews();
var app = builder.Build();
// The rest of the file isn't relevant for this chapter

这两种情况都可以获得IServiceCollection,其中默认已经填充了ASP.NET Core所需的一组服务,比如宿主服务、ConfigureServices方法之前执行的相关服务。
以上方法中,添加了更多的服务。


  • 首先,将包含COOKIE策略选项的配置类添加到ServiceCollection

  • AddMvc()方法添加MVC框架所需的服务。
    到目前为止,我们有大约140个服务注册到IServiceCollection
    但是,服务集合不是实际的DI容器,真实的DI容器被包装在所谓的服务提供者中(ServiceProvider)。



那么应该如何获取DI容器呢?



IServiceCollection有了一个扩展方法,它用于从服务集合中创建IServiceProvider,代码如下:


IServiceProvider provider = services.BuildServiceProvider()

ServiceProvider包含不可变容器,即在运行时无法更改。在ConfigureServices方法执行后,会在后台创建IServiceProvider
接下来,我们再看下如何在DI定制过程中,替代IServiceProvider


使用其他IServiceProvider


如果其他容器已经支持ASP.NET Core,则更改为其他或自定义DI容器将变得非常容易。通常,第三方DI容器会使用IServiceCollection做为自己的容器,它通过循环集合将已注册的服务移动到另一个容器。
我们用第三方容器Autofac举个例子。在命令行中键入以下命令,加载NuGet包:


dotnet add package Autofac.Extensions.DependencyInjection

要注册自定义IoC容器,通常需要注册不同的IServiceProviderFactory,IServiceProviderFactory将创建一个ServiceProvider实例。如果第三方容器支持ASP.NET Core,则必须提供一个该工厂类。如果你要使用Autofac,则需要使用AutofacServiceProviderFactory


我们在Program.cs中给IHostBuilder编写一个扩展方法,内部注册一个AutofacServiceProviderFactory:


using Autofac;
using Autofac.Extensions.DependencyInjection;
namespace DiSample;
public static class IHostBuilderExtension      public static IHostBuilder UseAutofacServiceProviderFactory(this IHostBuilder hostbuilder)
          
hostbuilder.UseServiceProviderFactory (new AutofacServiceProviderFactory());          return hostbuilder;     


注意,不要忘记将引入名称空间:AutofacAutofac.Extensions.DependencyInjection
要使用此扩展方法,可以在Program.cs中使用AutofacServiceProvider:


var builder = WebApplication.CreateBuilder(args);
builder.Host.UseAutofacServiceProviderFactory();
// Add services to the container. builder.Services.AddControllersWithViews();

以上通过扩展方法将AutofacServiceProviderFactory添加到IHostBuilder中,并启用AutofacIoC容器。后续会转而使用AutofacIServiceCollection添加服务。
再强调一下,除非必要。通常,我们不一定要替换现有的.NET CoreDI容器。


Scrutor简介


在本章的开头,我提到了服务的自动注册,这里可以通过其他DI容器完成。这里介绍一个名为Scrutor的不错的NuGet包来实现。
Scrutor通过向.NET Core DI容器向IServiceCollection添加一个扩展方法,用以自动注册服务。



扩展阅读
这里介绍一篇关于Scrutor的非常详细的博客文章,建议您继续阅读这篇文章以了解更多信息。



回顾


通过以上演示,我们将能够使用任何.NET标准兼容的DI容器替换现有容器。如果您选择的容器不包括ServiceProvider,请自己实现一个IServiceProvider接口,并在其中使用DI容器。如果您选择的容器没有提供填充服务的方法,请自行创建自己的方法。循环已注册的服务并将其添加到另一个容器中。
最后一步听起来很简单,实现起来比较费劲,因为需要将所有的IServiceCollection注册转换为其他容器的注册,它的复杂性取决于其他DI容器的实现细节。
任何时候,我们都可以选择使用任何与.NET标准兼容的DI容器,替换ASP.NET Core中的许多默认实现。
在下一章我们将探讨如何以不同的方式配置HTTPS,感谢您的阅读。


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
author-avatar
邓尕恒_789
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有